
//import { assert} from "assert";
var assert = require("assert");
var iconv = require("iconv-lite");

export var ch = {
    艾瑞珂:0x1,
    塞思:0x2,
    吉利安姆:0x3,
    弗朗茨:0x4,
    摩达:0x5,
    瓦内萨:0x6,
    罗斯:0x7,
    梅米:0x8,
    科曼:0x9,
    加西亚:0xa,
    希尼亚斯:0xb,
    露忒:0xc,
    娜塔莎:0xd,
    库格:0xe,
    伊弗列姆:0xf,
    弗鲁迪:0x10,
    凯尔:0x11,
    阿米莉娅:0x12,
    阿斯雷:0x13,
    杰斯特:0x14,
    特缇斯:0x15,
    玛莉卡:0x16,
    塞勒夫:0x17,
    尤恩:0x18,
    拉切尔:0x19,
    多兹拉:0x1a,
    雷纳克:0x1c,
    杜塞尔:0x1d,
    梅尔:0x1e,
    诺鲁:0x1f,
    约书亚:0x20,
    西蕾尼:0x21,
    塔娜:0x22,
    利昂:0x23,
    奥尔森:0x24,
    格伦:0x25,
    塞莱娜:0x26,
    沃尔塔:0x27,
    阿维:0x28,
    凯瑟达:0x29,
    法德:0x2a,
    依修梅娅:0x2b,
    海登:0x2c,
    亡灵战士_利昂:0x3b,
    塞门:0x3c,
    萨玛南:0x3d,
    亡灵战士_诺鲁:0x3e,
    亡灵战士_尤恩:0x3f,
    利昂_魔:0x40,
    穆尔瓦:0x41,
    奥尔森:0x42,
    沃尔塔:0x43,
    塞莱娜:0x44,
    沃尔塔:0x45,
    普利肯:0x46,
    波恩:0x47,
    帕滋帕:0x48,
    魔物:0x49,
    萨尔:0x4a,
    诺贝拉:0x4b,
    马莱:0x4c,
    迪拉德:0x4d,
    西克斯:0x4e,
    巴勃罗:0x4f,
    魔物:0x50,
    艾阿斯:0x51,
    卡莱尔:0x52,
    凯瑟达:0x53,
    巴勃罗:0x54,
    对战对手:0x55,
    魔物:0x56,
    阿维:0x57,
    肯普:0x5a,
    贝鲁奈:0x5b,
    魔物:0x5c,
    魔物:0x5d,
    魔物:0x5e,
    魔物:0x5f,
    奥尼尔:0x68,
    格伦:0x69,
    松克:0x6a,
    彼加尔德:0x6b,
    利昂_魔:0x6c,
    奥尔森_狂:0x6d,
    魔王:0xbe,
    弗雷利亚兵:0xc0,
    弗雷利亚兵:0xc1,
    法德:0xc5,
    海登:0xc7,
    曼塞尔:0xc8,
    克利姆德:0xc9,
    塔拉:0xca,
    依修梅娅:0xcb,
    天马传令兵:0xcc,
    罗斯顿兵:0xcd,
    罗斯顿兵:0xce,
};

export var c = {
领主_男:0x1,
领主_女:0x2,
大领主_男:0x3,
大领主_女:0x4,
轻骑士_男:0x5,
轻骑士_女:0x6,
圣骑士_男:0x7,
圣骑士_女:0x8,
重甲骑士_男:0x9,
重甲骑士_女:0xa,
将军_男:0xb,
将军_女:0xc,
盗贼:0xd,
龙人_龙形态:0xe,
佣兵_男:0xf,
佣兵_女:0x10,
勇者_男:0x11,
勇者_女:0x12,
剑士_男:0x13,
剑士_女:0x14,
剑圣_男:0x15,
剑圣_女:0x16,
刺客_男:0x17,
刺客_女:0x18,
弓箭手_男:0x19,
弓箭手_女:0x1a,
狙击手_男:0x1b,
狙击手_女:0x1c,
丛林骑士_男:0x1d,
丛林骑士_女:0x1e,
龙骑士_男:0x1f,
龙骑士_女:0x20,
龙骑统帅_男:0x21,
龙骑统帅_女:0x22,
翼龙骑士_男:0x23,
翼龙骑士_女:0x24,
魔法师_男:0x25,
魔法师_女:0x26,
贤者_男:0x27,
贤者_女:0x28,
魔法骑士_男:0x29,
魔法骑士_女:0x2a,
司祭_男:0x2b,
司祭_女:0x2c,
巫师_男:0x2d,
巫师_女:0x2e,
德鲁伊_男:0x2f,
德鲁伊_女:0x30,
召唤士_男:0x31,
召唤士_女:0x32,
侠盗:0x33,
恶魔蛋:0x34,
重骑士_男:0x35,
重骑士_女:0x36,
新人士兵2:0x37,
年轻战士3:0x38,
见习魔法师3:0x39,
新人士兵3:0x3a,
龙人_穆尔德:0x3b,
龙人_梅尔:0x3c,
年轻战士1:0x3d,
见习魔法师1:0x3e,
战士:0x3f,
勇士:0x40,
山贼:0x41,
海贼:0x42,
狂战士:0x43,
修道士:0x44,
神官:0x45,
吟游诗人:0x46,
新人士兵1:0x47,
天马骑士:0x48,
隼骑士:0x49,
修女:0x4a,
神官骑士:0x4b,
女武神:0x4c,
舞者:0x4d,
士兵:0x4e,
亡灵巫师:0x4f,
军舰:0x50,
亡灵战士:0x51,
僵尸:0x52,
木乃伊:0x53,
骷髅兵:0x54,
骷髅兵_弓箭:0x55,
骷髅战士:0x56,
骷髅战士_弓箭:0x57,
毒蜘蛛:0x58,
毒巨蛛:0x59,
独眼巨人:0x5a,
魔刹犬:0x5b,
三头地狱犬:0x5c,
战鬼:0x5d,
半人马:0x5e,
眼魔:0x5f,
大眼魔:0x60,
石化妖:0x61,
恶魔蛋:0x62,
石像鬼:0x63,
亡灵石像鬼:0x64,
僵尸龙:0x65,
魔王:0x66,
弩车:0x67,
弩车:0x68,
弩车:0x69,
弩车:0x6a,
弩车:0x6b,
弩车:0x6c,
孩子_男:0x6d,
孩子_女:0x6e,
市民_男:0x6f,
市民_女:0x70,
市民_男:0x71,
市民_女:0x72,
贵族:0x73,
女王:0x74,
王子:0x75,
公主:0x76,
无:0x77,
吟游诗人_昏迷:0x78,
运输队:0x79,
教皇:0x7a,
王子_昏迷:0x7b,
独眼巨人:0x7c,
毒巨蛛:0x7d,
年轻战士2:0x7e,
见习魔法师2:0x7f,
};

export var i = {
铁剑:0x01,
细身剑:0x02,
钢剑:0x03,
银剑:0x04,
铁之大剑:0x05,
钢之大剑:0x06,
银之大剑:0x07,
毒剑:0x08,
突刺剑:0x09,
玛尼_卡缇:0x0A,
勇者之剑:0x0B,
新月刃:0x0C,
必杀刃:0x0D,
破甲剑:0x0E,
斩龙剑:0x0F,
光之剑:0x10,
卢尼之剑:0x11,
破枪剑:0x12,
斩马刀:0x13,
铁枪:0x14,
细枪:0x15,
钢枪:0x16,
银枪:0x17,
毒枪:0x18,
勇者之枪:0x19,
必杀枪:0x1A,
　 刺马枪:0x1B,
投枪:0x1C,
锁链枪:0x1D,
破斧枪:0x1E,
铁斧:0x1F,
钢斧:0x20,
银斧:0x21,
毒斧:0x22,
勇者之斧:0x23,
必杀斧:0x24,
战戟:0x25,
战锤:0x26,
恶魔之斧:0x27,
投斧:0x28,
回旋斧:0x29,
破剑斧:0x2A,
弑剑斧:0x2B,
轻斧:0x2C,
铁弓:0x2D,
钢弓:0x2E,
银弓:0x2F,
毒弓:0x30,
必杀弓:0x31,
勇者之弓:0x32,
短弓:0x33,
长弓:0x34,
长弩:0x35,
钢铁弩:0x36,
必杀弩:0x37,
火炎:0x38,
闪电:0x39,
地狱业火:0x3A,
雷暴:0x3B,
终末之冬:0x3C,
弗尔布雷斯:0x3D,
艾克斯迦利瓦:0x3E,
闪光:0x3F,
阳光:0x40,
神圣之光:0x41,
净化之光:0x42,
光轮:0x43,
露丝:0x44,
熔流:0x45,
月光:0x46,
吸星术:0x47,
月食:0x48,
诺斯费拉特:0x49,
格雷普尼尔:0x4A,
回复之杖:0x4B,
治疗之杖:0x4C,
痊愈之杖:0x4D,
治愈之杖:0x4E,
生命之杖:0x4F,
复原之杖:0x50,
沉默之杖:0x51,
睡眠之杖:0x52,
狂乱之杖:0x53,
传送杖:0x54,
援救杖:0x55,
松明之杖:0x56,
修理之杖:0x57,
开锁杖:0x58,
魔防之杖:0x59,
龙斧:0x5A,
天使之衣:0x5B,
能量之环:0x5C,
秘传之書:0x5D,
疾风之羽:0x5E,
女神像:0x5F,
龙盾:0x60,
魔法护身符:0x61,
靴子:0x62,
体格指环:0x63,
英雄之证:0x64,
骑士勋章:0x65,
猎户座之箭:0x66,
天空之鞭:0x67,
指引之戒:0x68,
宝箱钥匙:0x69,
门钥匙:0x6A,
盗贼钥匙:0x6B,
伤药:0x6C,
特效药:0x6D,
圣水:0x6E,
消毒药:0x6F,
火把:0x70,
菲利的护符:0x71,
会员卡:0x72,
银卡:0x73,
白色宝玉:0x74,
青色宝玉:0x75,
赤色宝玉:0x76,
金币:0x77,
勒金雷布:0x78,
宝箱钥匙:0x79,
火炎爆弹:0x7A,
光之结界:0x7B,
波布罗的护符:0x7C,
法拉之力:0x7D,
妮妮斯的守护:0x7E,
托尔之怒:0x7F,
塞奇之祈祷:0x80,
斩魔之剑:0x81,
袭魔之枪:0x82,
断魔之斧:0x83,
破魔之弓:0x84,
吉克林迪:0x85,
战斧:0x86,
伊瓦尔迪:0x87,
统帅之证:0x88,
知惠之书:0x89,
天之刻印:0x8A,
利爪:0x8B,
拉特娜:0x8C,
龙枪:0x8D,
彼德弗尼尔:0x8E,
纳格尔法尔:0x8F,
死亡的吐息:0x90,
阿德姆拉:0x91,
吉克穆特:0x92,
贾尔姆:0x93,
尼兹赫古:0x94,
刺突枪:0x95,
短枪:0x96,
霸者之证:0x97,
月之腕轮:0x98,
太阳之腕轮:0x99,
_１Ｇ:0x9A,
_５Ｇ:0x9B,
_１０Ｇ:0x9C,
_５０Ｇ:0x9D,
_１００Ｇ:0x9E,
_３０００Ｇ:0x9F,
_５０００Ｇ:0xA0,
风之剑:0xA1,
伤药:0xA2,
伤药:0xA3,
伤药:0xA4,
舞蹈:0xA5,
漆黑的恶梦:0xA6,
魔石的碎片:0xA7,
不净的魔光:0xA8,
破灭的魔拳:0xA9,
龙石:0xAA,
魔幻的波动:0xAB,
暗黑的魔弹:0xAC,
腐爪:0xAD,
腐长爪:0xAE,
毒爪:0xAF,
猛毒之爪:0xB0,
灼热之牙:0xB1,
焦热之牙:0xB2,
邪眼光线:0xB3,
魔眼光线:0xB4,
石化光线:0xB5,
风之刃:0xB6,
修娜之实:0xB7,
_１５０Ｇ:0xB8,
_２００Ｇ:0xB9,
黑色宝玉:0xBA,
金色宝玉:0xBB,

};

var 角色 = [];
var 角色表 = {};
var 角色介绍 = [];

var 职业 = [];
var 职业表 = {};
var 职业描述 = [];

var 道具 = [];
var 道具表 = {};
var 道具说明 = [];

var tohex = (v)=>{
    return '0x'+v.toString(16);
};

export var set道具 = {
createASM:()=>{
    var code = '';
    道具.forEach((v,k)=>{
        if(v.id){

        }

        if(false){
        var name = 0;
        var desc = 0;
        var desc1 = 0
        var att = v.特殊属性;
        var icon = 0;
        code += `
@道具 ${v.id}
        .short  ${name}
        .short  ${desc}
        .short  ${desc1}
        @0x6
        .byte   ${v.id}
        .byte   ${v.类型}
        @0x8
        .int    ${att}
        .int    ${附加能力}
        .int    ${职业克制}
        @0x14
        .byte   ${v.基础属性.耐久}
        .byte   ${v.基础属性.攻击}
        .byte   ${v.基础属性.命中}
        .byte   ${v.基础属性.重量}
        .byte   ${v.基础属性.必杀}
        .byte   ${v.基础属性.射程}
        @0x1a
        .short   ${v.基础属性.单价}
        @0x1c
        .byte   ${v.熟练度}
        .byte   ${icon}
        .byte   ${v.道具效果}
        .byte   ${v.武器效果}
        .byte   ${v.熟练度获得}
        .byte 0
        .byte 0
        .byte 0
`;
        }
        else{
            //生成c代码
            code += `
[${tohex(v.id)}] = {${tohex(name)},${tohex(desc)},${tohex(desc1)},${tohex(v.id)},${v.类型},${tohex(v.特殊属性)},${附加能力},${职业特效},${v.基础属性.耐久}
    ,${v.基础属性.攻击}
    ,${v.基础属性.命中}
    ,${v.基础属性.重量}
    ,${v.基础属性.必杀}
    ,${v.基础属性.射程}
    ,${v.基础属性.单价}
    ,${v.熟练度}
    ,${icon}
    ,${v.武器效果}
    ,${v.熟练度获得}
    ,0,0,0},
`;
            //
        }
    });
},
设置道具:(索引,道具名,道具描述)=>{
    var data = {
        道具描述:道具描述,
        道具名:道具名,
        id:索引
    };
    道具[索引] = data;
    道具表[道具名] = 索引;
    return {
    类型:{
    剑:0,
	枪:1,
	斧:2,
	弓:3,
	杖:4,
	理:5,
	光:6,
	暗:7,
	道具:9,
	龙石_魔物专用:0xb,
	指环:0xc,
	火龙石:0x11,
	指环:0x12,
    },
    设置类型:(类型)=>{
        data.类型 = 类型;
    },
    基础属性:(v={
        耐久 = 1,
        攻击 = 1,
        命中 = 1,
        重量 = 1,
        必杀 = 1,
        射程 = 1,
        单价 = 1,
    })=>{
        data.基础属性 = v;
    },
    道具效果:(v={
        愈合=false,
        修补=false,
        恢复=false,
        物理=false,
        加固=false,
        还原=false,
        松明=false,
    })=>{
        data.道具效果 = 0;
    },
    武器效果:(v={
        毒药=false,
        吸血=false,
        伤害减半=false,
        反噬=false,
        石化=false,
    })=>{
        var t = {
            毒药:0x1,
            吸血:0x2,
            伤害减半:0x3,
            反噬:0x4,
            石化:0x5,
        };
        var value = 0;
        for (const key in v) {
            if(v[key]){
                value = t[key];
            }
        }
        data.武器效果 = value;
    },
    图标:(path)=>{
        data.图标 = path;
    },
    熟练度:(需求,获得量)=>{
        data.熟练度 = 需求;
        data.熟练度获得 = 获得量;
    },
    特殊属性:(v=[
        武器=false,
        道具=false,
        魔法=false,
        杖=false,
        无限耐久=false,
        无法出售=false,
        两次攻击=false,
        魔法伤害=false,
        远程属性=false,
        反克效果=false,
        指环_修理杖 =false,
        BOSS专用=false,
        剑士专用=false,
        飞行守护=false,
        必杀守护=false,
        破防效果=false,
        女主专用=false,
        男主专用=false,
    ])=>{
        var value = 0;
        var t = {
            武器:0x1,
            道具:0x2,
            魔法:0x2,
            杖:0x4,
            无限耐久:0x8,
            无法出售:0x10,
            两次攻击:0x20,
            魔法伤害:0x40,
            远程属性:0x80,
            反克效果:0x100,
            指环_修理杖 :0x200,
            BOSS专用:0x400,
            剑士专用:0x1000,
            飞行守护:0x4000,
            必杀守护:0x8000,
            破防效果:0x20000,
            女主专用:0x40000,
            男主专用:0x80000,
        };
        for (const key in v) {
            if(v[key]){
                value |= t[key];
            }
        }
        data.特殊属性 = v;
    },
    附加能力:(v=[
        aHP = 0,
        a力量 = 0,
        a技术 = 0,
        a速度 = 0,
        a守备 = 0,
        a魔防 = 0,
        a幸运 = 0,
    ])=>{
        data.附加能力 = v;
    },
    职业特效:(v=[])=>{
    },
    };
},
};

export var set职业 = {
设置职业:(索引,职业名,职业介绍)=>{
    职业表[职业名] = 索引;
    var data = {
        职业名:职业名,
        职业介绍:职业介绍,
    };
    职业[索引] = data;
    职业描述[索引] = 职业介绍;
    return {
        附加能力值:(v={
              HP = 0,
            力量 = 0,
            技术 = 0,
            速度 = 0,
            守备 = 0,
            魔防 = 0,
            体格 = 0,
            移动 = 5,
        })=>{
            data.附加能力值 = v;
        },
        上限:(v={
            HP = 60,
            力量 = 20,
            技术 = 20,
            速度 = 20,
            守备 = 20,
            魔防 = 20,
            体格 = 20,
        })=>{
            data.上限 = v;
        },
        成长:(v={
            HP = 30,
            力量 = 30,
            技术 = 30,
            速度 = 30,
            守备 = 30,
            魔防 = 30,
            运气 = 30,
        })=>{
            data.成长 = v;
        },
        转职加成:(v={
            HP = 2,
            力量 = 1,
            技术 = 1,
            速度 = 1,
            守备 = 1,
            魔防 = 1,
        })=>{
            data.转职加成 = v;
        },
        武器熟练度:(v={
            剑 = 0,
            枪 = 0,
            斧 = 0,
            弓 = 0,
            杖 = 0,
            理 = 0,
            光 = 0,
            暗 = 0,
        })=>{
            data.武器熟练度 = v;
        },
        战斗动画:(索引=[])=>{
            data.战斗动画 = 索引;
        },
        职业能力:(v={            a再移动=false,
            a偷盗 = false,
            a使用盗贼钥匙 = false,
            a舞蹈 = false,
            a演奏 =false,
            a必杀加成 = false,
            a上位职业 = false,
            a运输队 = false,
            a战马 = false,
            a飞龙 = false,
            a飞马 = false,
            a压制 = false,
            a女性 = false,
            aboss = false,
            a魔王专用 = false,
            a剑士专用 = false,
            a龙_魔物专用 = false,
            a_10级 = false,
            a能力未知 = false,
            a三角攻击1 = false,
            a三角攻击2 = false,
            a瞬杀 = false,
            a封魔 = false,
            a召唤 = false,
            a女主角专用 = false,
            a男主角专用 = false,
            a琳专用 = false,
            a大贤者专用 = false,})=>{
                data.职业能力 = v;
        },
    };
},
},

var convertText = (text)=>{
    //var text =
    var charp = {};
    var num = 0;
    var newText = '';
    var pos = 9;
    var hex = (v)=>{
        var vv = v.toString(16);
        if(vv.length==1){
            vv = '0' + vv;
        }
        return vv;
    }
    do{
        var a = text.match(/\[[^\]]+\]/);
        var len = undefined;
        if(a){
            len = a.index-1;
        }
        var tex = text.substr(0,len);
        newText += tex;
        if(a==null){
            if(num==0){
                return text;
            }
            break;
        }
        //console.log(a);
        var char = a[0];
        var _pos = char.match(/\>+\]/);
        var close = char.match(/\@/);
        if(_pos){
            if(_pos[0]=='>]'){
                pos = 9;
            }
            else if(_pos[0]=='>>]'){
                pos = 10;
            }
            else if(_pos[0]=='>>>]'){
                pos = 0x8;
            }
            else if(_pos[0]=='>>>>]'){
                pos = 0xe;
            }
        }
        else{
            _pos = char.match(/\[\<+/);
            if(_pos){
                if(_pos[0]=='[<')
                    pos = 0xc;
                else if(_pos[0]=='[<<')
                    pos = 0xb;
                else if(_pos[0]=='[<<<')
                    pos = 0xd;
                else if(_pos[0]=='[<<<<'){
                    pos = 0xf;
                }
            }
        }
        //console.log(_pos)
        char = char.replace('[','');
        char = char.replace(']','');
        char = char.replace('<','');
        char = char.replace('>','');
        char = char.replace('@','');
        var id = 0;
        if(!charp[char]){
            newText += `%${hex(pos)}%%10%%${hex(id)}%%01%`;
            charp[char] = pos;
        }
        else{
            newText += `%${hex(charp[char])}%`;
        }
        if(close){
            newText += `%11%`;
        }

        //console.log(char);
        text = text.substr(a[0].length+a.index+1);
        num++;
    }while(1);
    return newText;
}

var textIdx =  0x8000;
var textCode = "";
var Escape = 37;    //'%'
var newText = (text)=>{

    //如果遇到对话文本，则处理对话文本
    text = convertText(text);

    var a = iconv.encode(text,"gbk");
    var code = '';
    for(var i=0;i<a.length;){
        var v = code[i];
        if(v==10){ //\n
            if(code[i+1]==10){ //\n\n
                i += 2;
                code += '0x3,0x1,'
            }
            else{ //\n
                i += 1;
                code += '0x1,';
            }
        }
        else if(v!=Escape){
            code += '0x'+v.toString(16) + ',';
            i++;
        }
        else{
            code += `0x${code[i+1]}${code[i+2]}`;
            i+=4;
        }
    };

    textCode += `
    [${textIdx}-textStart] = (int)(const char[]){${code} 0},
`;
    console.log(textCode);
    return textIdx++;
}

export var newtext = newText;

export var set角色 = {
设置角色:(索引,角色名)=>{
    角色表[角色名] = 索引;
    var data = {};
    角色[索引] = data;
    return {
        createASM:()=>{

        },
        设置对话头像:(png_path)=>{
            data.对话头像 = png_path;
        },
        设置头像:(png_path)=>{
            data.头像 = png_path;
        },
        基本能力:(v = {
            aHP = 16,
            a等级 = 1,
            a力量=5,
            a技术=5,
            a速度=5,
            a守备=5,
            a魔防=5,
            a运气=0,
            a体格=5,
            a魔力=5,
        })=>{
            data.基本能力 = v;
        },
        人物特技:(v ={
            a再移动=false,
            a偷盗 = false,
            a使用盗贼钥匙 = false,
            a舞蹈 = false,
            a演奏 =false,
            a必杀加成 = false,
            a上位职业 = false,
            a运输队 = false,
            a战马 = false,
            a飞龙 = false,
            a飞马 = false,
            a压制 = false,
            a女性 = false,
            aboss = false,
            a魔王专用 = false,
            a剑士专用 = false,
            a龙_魔物专用 = false,
            a_10级 = false,
            a能力未知 = false,
            a三角攻击1 = false,
            a三角攻击2 = false,
            a瞬杀 = false,
            a封魔 = false,
            a召唤 = false,
            a女主角专用 = false,
            a男主角专用 = false,
            a琳专用 = false,
            a大贤者专用 = false,
        })=>{
            data.特技 = v;
        },
        支援人物:(a=[])=>{
            data.支援 = a;
        },
        武器熟练度:(v={
            剑 = 0,
            枪 = 0,
            斧 = 0,
            弓 = 0,
            杖 = 0,
            理 = 0,
            光 = 0,
            暗 = 0,
        })=>{
            data.武器熟练度 = v;
        },
        成长率:( v = {
            aHP=20,
            a力量=20,
            a技术=20,
            a速度=20,
            a运气=20,
            a守备=20,
            a魔防=20,
        })=>{
            data.成长率 = v;
        },
    }
},
};

var eventList = {};
var current = "";
var currentName = "";
var code = '';

var symbols = {};
var symbol_type = {};
var symbolT = {
none:0,
对话:1,
位置:2,
};


var symbol_codes = {};

var chapter_event = [{
    开始,结束,
    角色对话:[],
}];

var addasm = (c)=>{
    code += c;
    code += '\n';
};
var alloc_idx = 0;
//申请一个新符号
var alloc_sym = ()=>{
    alloc_idx ++;
    return "SYM_" + alloc_idx.toString();
}

//章节标志
var chapter_flg = 8;
var alloc_chapter_flg = ()=>{
    return chapter_flg++;
}

var evt = {
定义事件:(名字="")=>{
    //current = {code:""};
    if(!eventList[currentName]){
        eventList[currentName] = {code:current};
    }
    else{
        eventList[currentName].code += current;
    }
    var name = alloc_sym();
    currentName = name;
    symbols[名字] = name;
    symbol_type[名字] = symbolT.none;
    current = "";
    //current = "";
    //eventList[名字] = {code=current}
},

创建事件:(type,arg=[],size=2)=>{
    evt.create(type,arg,size);
},
create:(type,arg=[],size=2)=>{
    var c = '';
    if(size==2){
        arg[0] = arg[0]||0;
        arg[1] = arg[1]||0;
        c += `
@事件
        .byte ${arg[0]}|(${size<<4})
        .byte ${type}
        .short ${arg[1]}
        `;
    }
    else{
        arg[0] = arg[0]||0;
        arg[1] = arg[1]||0;
        arg[2] = arg[2]||0;
        c+= `
@事件
        .byte   ${arg[0]}|(${size<<4})
        .byte   ${type}
        .short  ${arg[1]}
        .int    ${arg[2]}
        `;
    }
    current += c;
},
设置章节开始事件:(index,名字="")=>{
    assert(symbols[名字],"符号不存在");
    assert(symbol_type[名字]==symbolT.none,"必须为 <定义事件> 定义的事件");
    chapter_event[index].开始 = symbols[名字];
},

设置章节结束事件:(index,名字="")=>{
    assert(symbols[名字],"符号不存在");
    assert(symbol_type[名字]==symbolT.none,"必须为 <定义事件> 定义的事件");
    chapter_event[index].结束 = symbols[名字];
},

设置章节对话事件:(index,名字="")=>{
    assert(symbols[名字],"符号不存在");
    assert(symbol_type[名字]==symbolT.对话,"必须为 <定义单位对话事件> 定义的事件");
    chapter_event[index].角色对话.push(symbols[名字]);
},

定义单位在移动到指定范围事件:(名字,x1,y1,x2,y2)=>{
    var name = alloc_sym();
    var flg = alloc_chapter_flg();
    var code = '';
    var num = 相互?1:2;
    symbols[名字] = alloc_sym();
    symbol_type[名字] = symbolT.对话;
    code += `
    @对话文本
    ${symbols[名字]}:
        .short  0xb
        .short  ${flg}
        .int    ${name}
        .byte   ${x1}
        .byte   ${y1}
        .byte   ${x2}
        .byte   ${y2}
    `;

    symbol_codes[symbols[名字]] = symbol_codes[symbols[名字]]||"";
    symbol_codes[symbols[名字]] += code;
},

定义单位对话事件:(名字="",角色1,角色2,相互=true)=>{
    var name = alloc_sym();
    var flg = alloc_chapter_flg();
    var code = '';
    var num = 相互?1:2;
    symbols[名字] = alloc_sym();
    symbol_type[名字] = symbolT.对话;

    for(var i=0;i<num;i++){
    code += `
@对话文本
${symbols[名字]}:
    .short  3
    .short  ${flg}
    .int    ${name}
    .byte   ${角色1}
    .byte   ${角色2}
    .short  0
    .short  0
    .short  0
`;
        var tmp = 角色1;
        角色1 = 角色2;
        角色2 = tmp;
    };
    symbol_codes[symbols[名字]] = symbol_codes[symbols[名字]]||"";
    symbol_codes[symbols[名字]] += code;
},

结束事件:()=>{
},

移动:(x,y)=>{
},

返回:()=>{
},

设置值:(id,val)=>{

},
//0x8
标签:(名称)=>{
    evt.create(0x8,[0,名称]);
},
//0x9
跳到标签:(标签)=>{
    evt.create(0x9,[0,名称]);
},
///////////////////////////////////////////////
//0xc
如果大于:(idx1,idx2)=>{
    var 标签 = 0
    evt.create(0xc,[3,标签,(idx1)|(idx2)])
},
如果小于:(idx1,idx2)=>{
    var 标签 = 0
    evt.create(0xc,[5,标签,(idx1)|(idx2)])
},
如果等于:(idx1,idx2)=>{
    var 标签 = 0
    evt.create(0xc,[0,标签,(idx1)|(idx2)])
},
如果不等于:(idx1,idx2)=>{
    var 标签 = 0
    evt.create(0xc,[1,标签,(idx1)|(idx2)])
},
如果大于等于:(idx1,idx2)=>{
    var 标签 = 0
    evt.create(0xc,[2,标签,(idx1)|(idx2)])
},
如果小于等于:(idx1,idx2)=>{
    var 标签 = 0
    evt.create(0xc,[43,标签,(idx1)|(idx2)])
},

//0x19
//配合0xc使用
获得回合数:()=>{
    evt.create(0x19,[3]);
},
是否在A路线:()=>{
    evt.create(0x19,[6]);
},

//0x03
//配合条件判断 0xc使用
获得标志:(offset)=>{
    evt.create(0x3,[1,offset]);
},

获得当前事件标志:(offset)=>{
    evt.create(0x3,[0,offset]);
},

//0x4
//配合0xc使用
获得随机数:(value=100)=>{
    evt.create(0x4,[0,value]);
},

//0x5
值复制:(idx1,idx2)=>{
    evt.create(0x5,[0,idx1|(idx2<<0x10)]);
},

//0x6
值加:(dest,idx1,idx2)=>{
    evt.create(0x6,[0,dest|(idx1<<8)|(idx2<<4)])
},

值减:(dest,idx1,idx2)=>{
    evt.create(0x6,[1,dest|(idx1<<8)|(idx2<<4)])
},

值乘:(dest,idx1,idx2)=>{
    evt.create(0x6,[2,dest|(idx1<<8)|(idx2<<4)])
},

值除:(dest,idx1,idx2)=>{
    evt.create(0x6,[3,dest|(idx1<<8)|(idx2<<4)])
},

值求余:(dest,idx1,idx2)=>{
    evt.create(0x6,[4,dest|(idx1<<8)|(idx2<<4)])
},

值位与:(dest,idx1,idx2)=>{
    evt.create(0x6,[5,dest|(idx1<<8)|(idx2<<4)])
},

值位或:(dest,idx1,idx2)=>{
    evt.create(0x6,[6,dest|(idx1<<8)|(idx2<<4)])
},

值位异或:(dest,idx1,idx2)=>{
    evt.create(0x6,[7,dest|(idx1<<8)|(idx2<<4)])
},

值左移:(dest,idx1,idx2)=>{
    evt.create(0x6,[8,dest|(idx1<<8)|(idx2<<4)])
},

值右移:(dest,idx1,idx2)=>{
    evt.create(0x6,[9,dest|(idx1<<8)|(idx2<<4)])
},

//////////////////////////////////////////////
//0xE
等待:(frame)=>{
    evt.create(0xe,[0,frame]);
},
//0x30
等待单位处理:()=>{
    evt.create(0x30,[0,0]);
},

////////////////////////
//0xd
执行ARM代码:(name)=>{
    evt.create(0xd,[0,0,name],4);
},

//////////////////////////////
//0x34
//尚未知道 a0=0xa,0xb,0xc
移除单位:(id)=>{
    evt.create(0x34,[0xf,id]);
},

设置单位为我方:(id)=>{
    evt.create(0x34,[2,id]);
},

设置单位为友方:(id)=>{
    evt.create(0x34,[3,id]);
},

设置单位为敌方:(id)=>{
    evt.create(0x34,[4,id]);
},

设置单位为已死亡:(id)=>{
    evt.create(0x34,[0xd,id]);
},

设置单位为已移动:(id)=>{
    evt.create(0x34,[0x6,id]);
},

设置单位消失:(id)=>{
    evt.create(0x34,[0xe,id]);
},


//0x17
背景淡出:(speed,白色=0)=>{
    evt.create(0x17,[白色?0:2,speed]);
},
背景淡入:(speed,白色=0)=>{
    evt.create(0x17,[白色?1:3,speed]);
},
//0x12
切换音乐:(id)=>{
    evt.create(0x12,[0,id]);
},


//25
切换地图:(id)=>{
    evt.create(0x17,[0,id]);
},

/////////////////////
//0x1b
/**
 * @param text string
 */
对话:(text=0xffff)=>{
    evt.create(0x1b,[0,text]);
},
对话关闭:()=>{
    evt.create(0x1b,[1,0]);
},
//////////////////////////
//0x3b
//光标移动
光标移动到角色:(id)=>{
    evt.create(0x3b,[1,id]);
},
光标关闭:()=>{
    evt.create(0x3b,[2]);
},
//0x5 设置栈值
// 0x30004B0    地址偏移的数据相当于寄存器   一共 12 个
//              0x30004e4 (相对0x30004B0第13个) 相当于sp，用于表示栈深度
//              0x30004e8 栈0
//              0x30004ec 栈1 ...
清空栈值:()=>{
    evt.create(0x5,[0,0xd,0],4);
},

值压栈:(src=0)=>{
    var eventType = 0x7;
    var len = 2;
    var arg = [1,0]; //arg[0] == 1 则把栈顶的值压栈,
                      //      ==0 则,把(int)[arg[1] * 4 + 0x30004B0] 压栈
                      //      ==2 [arg[1] * 4 + 0x30004B0] = 出栈值
    evt.create(0x7,[0,src]);
},

值压栈1:()=>{
    //等价于值压栈(1)
    evt.create(0x7,[1,0]);
},

值出栈:(dest=0)=>{
    evt.create(0x7,[2,dest]);
},

设置值:(offset,value)=>{
    var eventType = 0x5;
    var len = 4;
    var arg = [0,offset,value]; //0xd 位置为栈值
    evt.create(0x5,[0,offset,value],4);
},

/////////////////////////////////
//0x0a
调用外部事件:(name)=>{
    evt.create(0xa,[0,0,name]);
},

////////////////////////////////
//0x02
设置标志:(offset)=>{
    var arg = [
        (1<<3)  //设置值
        |1,     //事件标识
        offset
    ];
    var type = 0x02;
    evt.create(type,arg);
},

取消标志:(offset)=>{
    var arg = [
        (0<<3)  //取消值
        |0,     //事件标识
        offset
    ];
    var type = 0x02;
    evt.create(type,arg);
},

设置当前事件标志:(offset)=>{
    var arg = [
        (1<<3)  //设置值
        |1,     //事件标识
        offset
    ];
    var type = 0x02;
    evt.create(type,arg);
},

取消当前事件标志:(offset)=>{
    var arg = [
        (0<<3)  //取消值
        |0,     //事件标识
        offset
    ];
    var type = 0x02;
    evt.create(type,arg);
},
////////////////////////////////
//0x1a
文本显示开始:()=>{

},
文本显示:()=>{

},
文本结束:()=>{

},

切换关卡:()=>{

},

//0x25
切换地图:(chapter)=>{
    evt.create(0x25,[0,chapter]);
},

//0x19
单位配置保存:()=>{

},

//0x2f
移动单位:(id,x,y)=>{
    var eventType = 0x2f;
    var len = 4;
    var arg = [0,8,id|((x<<0x10)|(y<<0x18))];
    evt.create(eventType,arg,len);
},

移动单位到目标角色:(id,id2)=>{
    var eventType = 0x2f;
    var len = 4;
    var arg = [1,8,id|(id2<<0x10)];
    evt.create(eventType,arg,len);
},
往左移动单位:(id)=>{
    var eventType = 0x2f;
    var len = 4;
    var arg = [2,8,id];
    evt.create(eventType,arg,len);
},

往右移动单位:(id)=>{
    var eventType = 0x2f;
    var len = 4;
    var arg = [2,8,id|(1<<0x10)];
    evt.create(eventType,arg,len);
},

往上移动单位:(id)=>{
    var eventType = 0x2f;
    var len = 4;
    var arg = [2,8,id|(3<<0x10)];
    evt.create(eventType,arg,len);
},

往下移动单位:(id)=>{
    var eventType = 0x2f;
    var len = 4;
    var arg = [2,8,id|(2<<0x10)];
    evt.create(eventType,arg,len);
},

移动关闭单位:()=>{

},

////////////////////////////
//0x12
切换音乐:(id)=>{
    var eventType = 0x12;
    var len = 2;
    var arg = [0,id];
    evt.create(eventType,arg,len);
},

///////////////////////////////
//0x3a 显示提示框
提示框:(id,value=0)=>{
    var eventType = 0x3a;
    var len = 4;
    var arg = [0,id,value];
    evt.create(eventType,len,arg);
},

关卡名:(id,x=10,y=0)=>{
    var eventType = 0x3a;
    var len = 4;
    var arg = [1,id,(x<<0x10)|(y<<0x18)];
    evt.create(eventType,arg,len);
},

提示信息:(id,x=10,y=0)=>{
    var eventType = 0x3a;
    var len = 4;
    var arg = [2,id,(x<<0x10)|(y<<0x18)];
    evt.create(eventType,arg,len);
},

///////////////////////
// a0=0xa,0xb,0xc 例子在8A61178上
//0x34
移除单位:(id)=>{
},
更换阵营:(id)=>{
},

//////////////////////////
//0x37

给与:(id,item)=>{
    evt.设置值(3,item);
    var eventType = 0x37;
    var len = 2;
    var arg = [0,id];
    evt.create(eventType,arg,len);
},

//0x2c
//随机: number          第一项等级 +- 波动
//范围: {x,y,w,h}       在这个范围内加载单位
加载单位:(a = [
    {
        a角色,
        a职业,
        a领导,
        a等级修正,
        a我方,
        a友方,
        a敌方,
        a敌方,
        a等级,
        a坐标X,
        a坐标Y,
        a移动路线 = [{
            x = 0,
            y = 0,
            speed,
        }],
        a道具 = [
        ],
        a游戏AI = [
        ],
    }],范围={x=0,y=0,w=0,h=0},随机=0)=>{
        var eventType = 0x2c;
        var arg = [0,0,0]; //分别是

        var sym = alloc_sym();
        arg[2] = sym;
        var asm = `
${sym}:
`;
    a.forEach((v)=>{
        var char = v.a角色;
        var _class = v.a职业;
        var fixed = v.a等级修正?1:0;
        var ch = 0;
        ch = v.a友方?1:0;
        ch = v.a敌方?2:0;
        var flg = 0;
        var movesym = 0;
        if(v.a移动路线){
            movesym = alloc_sym();
            var _code = `
            ${movesym}:
            `;
            v.a移动路线.forEach((v,k)=>{
                v.speed = v.speed||0;
                _code += `
                .int (${v.x})|(${v.y}<<6)|(${v.speed}<<12)
                .short 0
                .short 0
                `;
            });
            //添加到汇编中
            addasm(_code);
        }
    asm += `
    .byte ${char}
    .byte ${_class}
    .byte 0
    .byte (${fixed})|(${ch}<<1)|(${v.a等级<<3})
    .short (${v.a坐标X})|(${v.a坐标Y<<6})|(${flg})
    .byte 0
    .byte ${v.a移动路线.length}
    .int  ${movesym}
    .byte ${v.a道具[0]},${v.a道具[1]},${v.a道具[2]},${v.a道具[3]}
    .int  ${v.a游戏AI}
    `
    });

    //添加到汇编中
    addasm(asm);
    evt.create(eventType,arg,len);
},

战斗动画:(左边角色id,右边角色id,a=[
    {
        a攻击方,        //攻击方 ,0为左边，1右方
        MISS,           //攻击是否miss
        a命中,          //
        a必杀,          //
        a瞬杀动画,       //
        a特效攻击动画,   //
        a特效防御盾,     //
        a伤害,          //如果为0，则正常计算，负数表示没有伤害
    },
])=>{
    if(a.length>0){
        //在这里设置战斗
        evt.清空栈值();

        a.forEach((v,k)=>{
            var value = 0;
            value |= v.a攻击方||0;
            value |= (v.a伤害||0)<<8;
            if(v.a必杀)
                value |= (1)<<16;
            else if(v.MISS)
                value |= (2)<<16;

            if(v.a瞬杀动画){
                value |= 0x8000000;
            }
            else if(v.a特效攻击动画){
                value |= 0x40000000;
            }
            else if(v.a特效防御盾){
                value |= 0x80000000;
            }

            evt.设置值(1,value);
            evt.值压栈();
        });
        //结束动画
        evt.设置值(1,0xffffffff);
        evt.值压栈();
    }
    var eventType = 0x3f;
    var arg = [0,左边角色id,右边角色id]; //分别是
    evt.create(eventType,arg,len);
},

镜头移动:(x,y)=>{
    evt.create(0x26,[0,(x)|(y<<8)]);
},

镜头移动到角色:(id)=>{
    evt.create(0x26,[1,id]);
},



};

export var e = evt;